﻿/*
 				________________________________COPYRIGHT_______________________________________
				Die Veröffentlichung dieses Objektes ist Illegal und wird strafrechtlich verfolgt
				werden. Sollte es zu einer Veröffentlichung kommen werden wir die Daten des
				Herrausgebers fündig machen und Anzeige erstatten. Desweiteren ist
				auch jeglicher Besitz dieses Objektes Illegal und kann ebenfalls als Grund für
				eine Anzeige verwendet werden.
				Ausnahmen der veröffentlichung und verleihung gelten nur wenn der Grundbesitzer
				diese durchführt.
				Die Uhrheberrechte dieses Objektes liegen der Entwickler Gruppe CyberScripting vor. 
                © 2011.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Audio;
using cubeworld.ScreenManager;

namespace cubeworld.World
{
    
    public class World
    {

        public List<Chunk> activeChunks = new List<Chunk>();
        public List<Block> visibleBlocks = new List<Block>();
        public List<Chunk> checkableChunks = new List<Chunk>();
        public Chunk currentChunk;

        ChunkManager chunkM;


        public void setup(bool load, NewWorldScreen screen)
        {
            screen.pb.setPercent(1);
            activeChunks.Add(new Chunk(0, 0));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(11);
            activeChunks.Add(new Chunk(16, 0));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(22);
            activeChunks.Add(new Chunk(16, 16));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(33);
            activeChunks.Add(new Chunk(0, 16));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(44);
            activeChunks.Add(new Chunk(-16, 0));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(55);
            activeChunks.Add(new Chunk(-16, -16));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.pb.setPercent(66);
            activeChunks.Add(new Chunk(0, -16));
            activeChunks[activeChunks.Count - 1].LoadChunk(true);
            screen.quit();

            chunkM = new ChunkManager(this);
            chunkM.onChunkChanged += new ChunkChanged(onChunkChanged);
            currentChunk = chunkM.getCurrentChunk(activeChunks);
            chunkM.setCheckableChunks();
        }

        public List<Block> giveCurrentChunkBlocks()
        {
            List<Block> checkableBlocks = new List<Block>();
            /*foreach (Chunk c in checkableChunks)
            {
                foreach (Block block in c.ABlocks)
                {
                    checkableBlocks.Add(block);
                }
            }*/
            return checkableBlocks;
            return checkableBlocks;
        }

        public void Draw()
        {
            Data.cubeModel.BeginDraw();
            foreach (Chunk ch in activeChunks)
            {
                ch.RenderChunk();
            }
            if (Data.isDebugMode)
                Data.spriteBatch.DrawString(Data.debugFont, activeChunks.Count.ToString(), new Vector2(200, 0), Color.White);
            Data.cubeModel.EndDraw();
            chunkM.Update(activeChunks);
        }
        

        public void Update(float elapsedTime)
        {
            //chunkM.Update();
            if (checkableChunks.Count > 0)
                Data.camera.Frezze = false;

            Collision.GetNearestBlockIntersectsRay(RayRenderer.GetPickRay(Matrix.Identity), elapsedTime);
        }

        public void onChunkChanged(object obj, EventArgs e, Chunk c)
        {
            currentChunk = chunkM.getCurrentChunk(activeChunks);
            if (c == null)
            {
                if (!chunkM.existsChunkAtStart((int)chunkM.newChunk.X * 16, (int)chunkM.newChunk.Y * 16, activeChunks))
                {
                    Data.camera.Frezze = true;
                    Chunk ch = new Chunk((int)chunkM.newChunk.X * 16, (int)chunkM.newChunk.Y * 16);
                    ch.LoadChunk();
                    ch.SaveChunk();
                    activeChunks.Add(ch);
                    Data.camera.Frezze = false;
                }
            }

            visibleBlocks = chunkM.getVisibleBlocks(activeChunks);
            chunkM.setCheckableChunks();
        }

        private int r(int zahl)
        {
            int get = (int)(zahl / 16); //rundet immer ab!
            return get;
        }

        


    }
}
